/**
 * 移动逻辑系统
 * 
 * 职责：
 * 1. 以固定帧率（20 FPS）更新实体的逻辑位置
 * 2. 只关心逻辑计算，不关心渲染
 * 
 * @author AI Assistant
 * @date 2025-11-26
 */

import { ecs } from "db://assets/core/ecs/ECS";
import { InterpolatedTransform } from "../component/InterpolatedTransform";

/**
 * 速度组件
 */
@ecs.register('Velocity')
export class VelocityComponent extends ecs.Comp {
    x: number = 0;
    y: number = 0;
    
    /** 最大速度 */
    maxSpeed: number = 500;
    
    reset(): void {
        this.x = 0;
        this.y = 0;
        this.maxSpeed = 500;
    }
    
    /**
     * 设置速度
     */
    setVelocity(x: number, y: number): void {
        this.x = x;
        this.y = y;
        this.clamp();
    }
    
    /**
     * 限制最大速度
     */
    private clamp(): void {
        const speed = Math.sqrt(this.x * this.x + this.y * this.y);
        if (speed > this.maxSpeed) {
            const ratio = this.maxSpeed / speed;
            this.x *= ratio;
            this.y *= ratio;
        }
    }
}

/**
 * 移动逻辑系统（固定 20 FPS）
 */
@ecs.register('MovementLogic')
export class MovementLogicSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate {
    filter(): ecs.IMatcher {
        return ecs.allOf(InterpolatedTransform, VelocityComponent);
    }
    
    init(): void {
        console.log('[MovementLogicSystem] ✅ 移动逻辑系统初始化（固定 20 FPS）');
    }
    
    /**
     * 固定更新（dt 始终是 0.05 秒）
     */
    update(entity: ecs.Entity): void {
        const transform = entity.get(InterpolatedTransform)!;
        const velocity = entity.get(VelocityComponent)!;
        
        // 计算新位置（逻辑层，固定 20 FPS）
        const newX = transform.position.x + velocity.x * this.dt;
        const newY = transform.position.y + velocity.y * this.dt;
        
        // 更新逻辑位置（会自动保存上一帧）
        transform.setPosition(newX, newY);
    }
    
    onDestroy(): void {
        console.log('[MovementLogicSystem] 🛑 移动逻辑系统销毁');
    }
}

/**
 * 导出系统实例
 */
export const movementLogicSystem = new MovementLogicSystem();

